package main.java.cris.model.dao;

import java.util.ArrayList;
import java.util.List;

import main.java.cris.model.entites.Cliente;
import main.java.cris.model.entites.Produto;
import main.java.cris.model.entites.Venda;

public class VendaDao {
	private static List<Venda> vendas = new ArrayList<Venda>();

	public static List<Venda> getVendas() {
		return vendas;
	}
	
	private static int getMaxCdVenda() {
		int max = 0;
		for (Venda i : vendas) {			
			if (i.getCdvenda() > max) {
				max = i.getCdvenda(); 
			}
		}
		return max;
	}

	public static boolean save(List<Venda> e) {
		if (e.size() < 1) {
			return false;
		}
		int max = getMaxCdVenda() +1;
		int seq = 1;
		int prov = 0;
		Cliente cli = null;
		Produto prod = null;				
		for (Venda i : e) {
			cli = ClienteDao.search(i.getMatricula());
			if (cli == null) {
				anulaVenda(max);
				return false;
			}
			prod = ProdutoDao.search(i.getCodigo());
			if (prod == null) {
				anulaVenda(max);
				return false;
			}	
			if (prod.getQtd() > 0) {
				prov = prod.getQtd() - i.getQtd();
				if (prov < 0) {
					prov = 0;
				}
				prod.setQtd(prov);				
			}
			i.setSubTotal(i.getQtd() * prod.getPreco());
			if (cli.getSaldo() < i.getSubTotal()) {
				anulaVenda(max);
				return false;
			}
			cli.setSaldo(cli.getSaldo() - i.getSubTotal());			
			i.setCdvenda(max);
			i.setNrsequencia(seq++);			
			vendas.add(i);
			ProdutoDao.update(prod);
			ClienteDao.update(cli);
		}
		return true;
	}
	
	private static boolean anulaVenda(int cdvenda) {
		Cliente cli = null;
		Produto prod = null;		
		for (Venda i : vendas) {
			if (i.getCdvenda() == cdvenda) {				
				if (i.getMatricula() > 0) {
					cli = ClienteDao.search(i.getMatricula());
					if (cli != null) {
						cli.setSaldo(cli.getSaldo() + (i.getQtd() * i.getSubTotal()));
						ClienteDao.update(cli);
					}
				}
				if (i.getCodigo() > 0) {
					prod = ProdutoDao.search(i.getCodigo());
					if (prod != null) {
						prod.setQtd(prod.getQtd() + i.getQtd());
						ProdutoDao.update(prod);
					}
				}
			}
		}
		return true;
	}
	
	public static List<Venda> search(int cdvenda) {
		List<Venda> result = null;
		for (Venda i : vendas) {
			if (i.getCdvenda() == cdvenda) {
				if (result == null) {
					result = new ArrayList<Venda>();
				}
				result.add(i);
			}
		}
		return result;
	}
}
